﻿
#include "dx_spherical.h"

using namespace DirectX;

namespace ifire::dx {
///////////////////////////////////////////////////////////////////////////////
// Spherical
///////////////////////////////////////////////////////////////////////////////
#pragma region Spherical
XMMATRIX Spherical::GetViewMatrix() const {
  // 将球面坐标置换为笛卡尔坐标
  float sin_phi = sinf(phi);
  float x = radius * sin_phi * cosf(theta);
  float z = radius * sin_phi * sinf(theta);
  float y = radius * cosf(phi);

  // 构建观察矩阵
  XMVECTOR pos = XMVectorSet(x, y, z, 1.0f);
  XMVECTOR target = XMVectorZero();
  XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);

  return XMMatrixLookAtLH(pos, target, up);
}

XMFLOAT3 Spherical::GetCartesian() const {
  float sin_phi = sinf(phi);
  float x = radius * sin_phi * cosf(theta);
  float z = radius * sin_phi * sinf(theta);
  float y = radius * cosf(phi);
  return XMFLOAT3(x, y, z);
}

#pragma endregion
} // namespace ifire::dx